package com.controllers;

import com.beans.Book;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

//如果类中所有的方法都是AJAX请求可以放到类的前面，方法前不加，而且都只能是异步调用了。
//@ResponseBody
//声明给Spring管理。
@Controller
//声明此控制器类的请求url路径。斜杆可以不写，习惯上写；
//类的请求注解可以省略。
@RequestMapping("/book")
public class BookController {

    @RequestMapping("/add")
    //接收请求行数据。
    //把传递过来的name给a,author给b,price给c。如果控制器方法的参数和webapp/book_add.jsp请求行传值的key参数名字相同，则@RequestParam可以省略。
//    public void addBook(String name,String author,String price)
    public String addBook(@RequestParam("name") String a, @RequestParam("author") String b, @RequestParam("price") double c, Model model) {
        System.out.println("-----book-add");
        model.addAttribute("key1","value1");
        model.addAttribute("book",new Book(1,"JAVA","老张",232));
//        加/表示上一层，即根路径，否则会在book下寻找。如果BookController没有加@RequestMapping注解则不需要反斜杠/。
        return "/tips.jsp";

    }

    @RequestMapping("/add2")
    public String addBook2(@RequestParam("name") String a, @RequestParam("author") String b, @RequestParam("price") double c, HttpServletRequest request) {
        System.out.println("-----book-add");
        request.setAttribute("key1","value1");
        request.setAttribute("book",new Book(1,"JAVA","老张",232));
//        加/表示上一层，即根路径，否则会在book下寻找。如果BookController没有加@RequestMapping注解则不需要反斜杠/。
        return "/tips.jsp";
    }

    @RequestMapping("/add3")
    public ModelAndView addBook3(@RequestParam("name") String a, @RequestParam("author") String b, @RequestParam("price") double c) {
        System.out.println("-----book-add");
        //redirect:/tips.jsp"为重定向，不加redirect:就是转发
        ModelAndView modelAndView = new ModelAndView("/tips.jsp");
        modelAndView.addObject("key1","value2");
        modelAndView.addObject("book",new Book(1,"JRR","老5张",2832));
//        加/表示上一层，即根路径，否则会在book下寻找。如果BookController没有加@RequestMapping注解则不需要反斜杠/。
        return modelAndView;

    }
    @RequestMapping("/list")
    //请求头一定要加@RequestHeader
    //同时传请求头和请求行
    public void addBook(String name,String author,String price,@RequestHeader("token") String token){
        System.out.println("-----book-list");
        System.out.println(name);
        System.out.println(author);
        System.out.println(price);
        System.out.println(token);
    }


//    public void listBook(@RequestHeader String token) {
//
//        System.out.println(token);
//        System.out.println("-----book-list");
//    }

//    @RequestMapping("/update")
//    //Servlet处理方式：使用request的输入流接收请求体数据。
//    public void udpate(HttpServletRequest httpServletRequest){
//        System.out.println("-----book-update");
//        try {
//            ServletInputStream inputStream = httpServletRequest.getInputStream();
//            StringBuffer buffer = new StringBuffer();
//            byte[] bs = new byte[100];
//            int len =-1;
//            while((len=inputStream.read(bs))!=-1){
//                //流读到的字节变成字符串，再把字符串拼接到buffer中。
//                String s = new String(bs,0,len);
//                buffer.append(s);
//            }
//            System.out.println(buffer.toString());
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//    }

//    //使用response中的输出流进行响应。
//    @RequestMapping("/update")
//    //@RequestBody可以自动JSON转对象
//    public void udpate(@RequestBody Book book, HttpServletResponse response){
//        System.out.println("-----book-update");
//        System.out.println(book);
//
//        //使用ObjectMapper将对象转为JSON格式字符串；
//        try {
//            String s = new ObjectMapper().writeValueAsString(book);
//            response.setCharacterEncoding("utf-8");
//            //声明返回的是JSON数据。
//            response.setContentType("application/json");
//            PrintWriter out = response.getWriter();
//            out.println(s);
//            out.flush();
//            out.close();
//        } catch (JsonProcessingException e) {
//            e.printStackTrace();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//
//    }

    //直接在控制器方法返回响应对象；
    @RequestMapping("/update")
    //如果所有的类都是AJAX请求可以放到类的前面。
    @ResponseBody
    //@RequestBody可以自动JSON转对象
    public List<Book> udpate(){
        System.out.println("-----book-update");
        List<Book> books = new ArrayList<>();
        books.add(new Book(1,"JAVA","老张",232));
        books.add(new Book(2,"C++","老额",289.32));
        return books;
    }
}
